package br.com.salao.dao;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.Query;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;

import br.com.salao.bean.Agendamento;
import br.com.salao.dao.AgendamentoDao;
import br.com.salao.util.JpaUtil;

public class AgendamentoDaoImpl implements AgendamentoDao {

	private final GenericDao<Agendamento> dao;
	private EntityManager em;

	public AgendamentoDaoImpl(EntityManager em){
		dao = new GenericDao<Agendamento>(em,Agendamento.class);
		this.em = em;
	}

	@Override
	public Agendamento inserir(Agendamento agendamento) {
		return dao.salvar(agendamento);
	}

	@Override
	public Agendamento update(Agendamento agendamento) {
		return dao.update(agendamento);
	}

	@Override
	public List<Agendamento> lista() {
		return dao.lista();
	}

	public List<Agendamento> buscarAgendamentos(int idEstabelecimento,Date dataAgendamento){

		try{

			CriteriaBuilder builder = this.em.getCriteriaBuilder();

			CriteriaQuery<Agendamento> criteria = builder.createQuery(Agendamento.class);
			Root<Agendamento> root = criteria.from(Agendamento.class);

			Predicate conjuction = builder.conjunction();
			conjuction = builder.and(conjuction, builder.equal(root.get("estabelecimento"),idEstabelecimento));
			if(dataAgendamento != null){
				conjuction = builder.and(conjuction, builder.equal(root.get("data"),dataAgendamento));
			}			

			criteria.where(conjuction);

			return this.em.createQuery(criteria).getResultList();

		}catch (Exception e) {
			return null;
		}

	}

	@SuppressWarnings("unchecked")
	public List<Agendamento> buscarAgendamentoPorUsuario(int idUsuario){

		EntityManager em = JpaUtil.getEntityManager();
		List<Agendamento> agendamentos = new ArrayList<Agendamento>();

		try{
			Query query = em.createQuery("from Agendamento a where a.usuarioSolicitante.id = :idUsuario order by a.created desc");
			query.setParameter("idUsuario", idUsuario);
			agendamentos = (List<Agendamento>) query.getResultList();
			
		}catch (Exception e) {
			e.printStackTrace();
			agendamentos = null;			
		}finally{
			if(em != null){
				em.close();
			}
		}
		return agendamentos;
	}

	

	public EntityManager getEm() {
		return em;
	}

	public void setEm(EntityManager em) {
		this.em = em;
	}


}
